O SQL JOIN é um dos recursos mais importantes do SQL, porque permite combinar dados de duas ou mais tabelas em uma única consulta. Ele é amplamente usado quando as informações estão divididas em tabelas relacionadas, como clientes e pedidos, produtos e categorias, alunos e matrículas.
Neste artigo, você vai entender o que é JOIN, como ele funciona, quais são os principais tipos e ver exemplos práticos para usar no dia a dia.
O que é SQL JOIN?
JOIN é uma cláusula usada para relacionar tabelas por meio de uma coluna em comum, geralmente uma chave primária em uma tabela e uma chave estrangeira em outra. Em vez de consultar cada tabela separadamente, você consegue unir os dados e montar resultados mais completos.
Em bancos relacionais, isso é essencial porque as informações costumam ser normalizadas, ou seja, separadas em várias tabelas para evitar duplicidade e facilitar a organização.
Como o JOIN funciona
O JOIN compara valores de uma coluna entre tabelas e retorna os registros que atendem à condição definida na cláusula ON. Dependendo do tipo de JOIN, ele pode trazer apenas os registros correspondentes ou também registros sem correspondência em uma das tabelas.
A estrutura básica costuma seguir este padrão:
SELECT colunas
FROM tabela1
JOIN tabela2
ON tabela1.campo = tabela2.campo;
O segredo está em entender qual tipo de junção usar para cada situação.
Exemplo de tabelas
Para facilitar, vamos imaginar duas tabelas: clientes e pedidos.
Tabela clientes
id_cliente | nome
1 | Ana
2 | Bruno
3 | Carla
4 | Diego
Tabela pedidos
id_pedido | id_cliente | produto
101 | 1 | Teclado
102 | 1 | Mouse
103 | 3 | Monitor
104 | 5 | Cadeira
Nesse cenário, nem todos os clientes fizeram pedidos, e existe um pedido de um cliente que não aparece na tabela de clientes. Isso nos ajuda a entender melhor o comportamento de cada tipo de JOIN.
INNER JOIN
O INNER JOIN retorna apenas os registros que têm correspondência nas duas tabelas. Se não houver match entre os campos relacionados, o registro não aparece no resultado.
SELECT c.nome, p.produto
FROM clientes c
INNER JOIN pedidos p
ON c.id_cliente = p.id_cliente;
Resultado esperado: apenas Ana e Carla apareceriam, porque são os clientes que têm pedidos vinculados.
nome | produto
Ana | Teclado
Ana | Mouse
Carla | Monitor
Esse é o tipo de JOIN mais usado quando você quer apenas dados relacionados.
LEFT JOIN
O LEFT JOIN retorna todos os registros da tabela da esquerda e, quando houver correspondência, traz os dados da tabela da direita. Se não houver correspondência, os campos da tabela da direita vêm como NULL.
SELECT c.nome, p.produto
FROM clientes c
LEFT JOIN pedidos p
ON c.id_cliente = p.id_cliente;
Resultado esperado: todos os clientes aparecerão, mesmo aqueles sem pedidos, como Bruno e Diego.
nome | produto
Ana | Teclado
Ana | Mouse
Bruno | NULL
Carla | Monitor
Diego | NULL
Esse tipo é muito útil para identificar cadastros sem movimentação, como clientes sem compras ou alunos sem matrícula.
RIGHT JOIN
O RIGHT JOIN funciona de forma parecida com o LEFT JOIN, mas retorna todos os registros da tabela da direita. Quando não existe correspondência, os campos da tabela da esquerda ficam como NULL.
SELECT c.nome, p.produto
FROM clientes c
RIGHT JOIN pedidos p
ON c.id_cliente = p.id_cliente;
Resultado esperado: todos os pedidos aparecerão, inclusive o pedido com id_cliente = 5, mesmo que esse cliente não exista na tabela de clientes.
nome | produto
Ana | Teclado
Ana | Mouse
Carla | Monitor
NULL | Cadeira
Na prática, o RIGHT JOIN é menos usado do que o LEFT JOIN, porque muitas vezes é possível inverter a ordem das tabelas e usar LEFT JOIN no lugar.
FULL OUTER JOIN
O FULL OUTER JOIN retorna todos os registros das duas tabelas. Quando não houver correspondência, os campos da tabela sem match aparecem como NULL.
SELECT c.nome, p.produto
FROM clientes c
FULL OUTER JOIN pedidos p
ON c.id_cliente = p.id_cliente;
Resultado esperado: você verá todos os clientes e todos os pedidos, mesmo os que não têm relação entre si.
nome | produto
Ana | Teclado
Ana | Mouse
Bruno | NULL
Carla | Monitor
Diego | NULL
NULL | Cadeira
Esse tipo é ideal quando você quer uma visão completa dos dois lados da relação.
CROSS JOIN
O CROSS JOIN gera todas as combinações possíveis entre os registros das tabelas. Ele não usa condição de correspondência com ON.
SELECT c.nome, p.produto
FROM clientes c
CROSS JOIN pedidos p;
Se houver 4 clientes e 4 pedidos, o resultado terá 16 combinações. Isso pode ser útil em situações específicas, como geração de combinações ou testes, mas deve ser usado com cuidado porque pode produzir muitos registros.
SELF JOIN
O SELF JOIN é quando uma tabela se relaciona com ela mesma. Ele é útil em estruturas hierárquicas, como funcionários e seus gerentes, categorias e subcategorias, ou cidades e estados relacionados em uma mesma tabela.
SELECT a.nome AS funcionario, b.nome AS gerente
FROM funcionarios a
LEFT JOIN funcionarios b
ON a.id_gerente = b.id_funcionario;
Esse tipo de JOIN é muito usado quando os dados da própria tabela precisam ser comparados entre si.
Diferença entre os tipos
| Tipo | O que retorna |
|---|---|
| INNER JOIN | Somente registros com correspondência nas duas tabelas. |
| LEFT JOIN | Todos os registros da tabela da esquerda e correspondências da direita. |
| RIGHT JOIN | Todos os registros da tabela da direita e correspondências da esquerda. |
| FULL OUTER JOIN | Todos os registros das duas tabelas, com NULL onde não houver correspondência. |
| CROSS JOIN | Todas as combinações possíveis entre os registros. |
| SELF JOIN | Relaciona a própria tabela com ela mesma. |
Boas práticas ao usar JOIN
Use aliases para deixar a consulta mais legível e fácil de manter. Isso evita repetir nomes longos de tabelas e melhora a organização do código.
Tenha atenção à cláusula ON, porque uma condição errada pode gerar resultados incompletos ou duplicados. Também é importante entender quais colunas realmente fazem parte do relacionamento entre as tabelas.
Evite usar JOIN sem necessidade, principalmente em tabelas grandes, pois isso pode impactar o desempenho da consulta. Sempre revise o resultado para garantir que a lógica está correta.
Exemplo prático completo
A seguir, um exemplo mais realista para listar clientes e seus pedidos:
SELECT
c.id_cliente,
c.nome,
p.id_pedido,
p.produto
FROM clientes c
LEFT JOIN pedidos p
ON c.id_cliente = p.id_cliente
ORDER BY c.nome;
Esse tipo de consulta é bastante comum em sistemas de vendas, relatórios gerenciais e dashboards. Ela permite visualizar os clientes com ou sem pedidos, o que ajuda em análises mais completas.
Quando usar cada um
- Use
INNER JOINquando quiser apenas registros relacionados. - Use
LEFT JOINquando quiser manter todos os registros da tabela principal. - Use
RIGHT JOINquando a tabela da direita for a principal. - Use
FULL OUTER JOINquando quiser tudo de ambas as tabelas. - Use
CROSS JOINquando precisar de todas as combinações possíveis. - Use
SELF JOINquando a tabela precisar ser comparada com ela mesma.
Conclusão
O SQL JOIN é uma ferramenta fundamental para quem trabalha com bancos de dados, porque permite cruzar informações e criar consultas muito mais ricas. Entender a diferença entre INNER, LEFT, RIGHT, FULL, CROSS e SELF JOIN faz toda a diferença na hora de montar relatórios e análises.
Com prática, você vai perceber que escolher o JOIN correto é menos sobre decorar sintaxe e mais sobre entender a relação entre as tabelas. Quando isso fica claro, suas consultas se tornam mais precisas, úteis e profissionais.